# 人工智能NLP-Agent数字人项目-02-日程提醒任务工单V1.1-20250217
import sqlite3
from typing import Any
from langchain.tools import BaseTool
from agent import agent_service


class DeleteTimer(BaseTool):
    # 工具的名称
    name: str = "DeleteTimer"
    # 工具的描述信息
    description: str = "用于删除某一个日程，接受任务id作为参数，如：2"

    def __init__(self):
        # 调用父类的构造函数
        super().__init__()

    def validate_task_id(self, para: str):
        """
        验证输入的任务ID是否为有效的整数
        :param para: 输入的任务ID字符串
        :return: 有效的任务ID整数或错误信息
        """
        try:
            task_id = int(para)
            return task_id
        except ValueError:
            return "输入的 ID 无效，必须是数字。"

    def delete_task_from_db(self, task_id: int):
        """
        从数据库中删除指定ID的任务
        :param task_id: 任务ID
        :return: 删除结果信息
        """
        try:
            with sqlite3.connect('timer.db') as conn:
                cursor = conn.cursor()
                cursor.execute("DELETE FROM timer WHERE id = ?", (task_id,))
                if cursor.rowcount == 0:
                    return f"任务 {task_id} 不存在，删除失败。"
                conn.commit()
                return None
        except sqlite3.Error as e:
            return f"数据库错误: {e}"

    def cancel_scheduled_task(self, task_id: int):
        """
        取消已调度的任务
        :param task_id: 任务ID
        :return: 取消结果信息
        """
        if task_id in agent_service.scheduled_tasks:
            agent_service.scheduled_tasks[task_id].cancel()
            del agent_service.scheduled_tasks[task_id]
            return f"任务 {task_id} 取消成功。"
        return f"任务 {task_id} 未在调度列表中，可能已被删除。"

    def _run(self, para: str) -> str:
        # 验证任务ID
        task_id = self.validate_task_id(para)
        if isinstance(task_id, str):
            return task_id

        # 从数据库中删除任务
        db_error = self.delete_task_from_db(task_id)
        if db_error:
            return db_error

        # 取消已调度的任务
        return self.cancel_scheduled_task(task_id)


if __name__ == "__main__":
    # 创建 DeleteTimer 工具的实例
    tool = DeleteTimer()
    # 调用工具的 run 方法，传入任务 ID
    result = tool.run("1")
    # 打印执行结果
    print(result)